package ar.edu.utn.frgp.Banco.service.impl;

import java.math.BigDecimal;
import java.util.List;
import ar.edu.utn.frgp.Banco.dao.IClienteDao;
import ar.edu.utn.frgp.Banco.dao.ICuentaDao;
import ar.edu.utn.frgp.Banco.dao.IPlazosFijosDao;
import ar.edu.utn.frgp.Banco.dao.IMovimientosDao;
import ar.edu.utn.frgp.Banco.model.Cliente;
import ar.edu.utn.frgp.Banco.model.Cuenta;
import ar.edu.utn.frgp.Banco.model.Movimiento;
import ar.edu.utn.frgp.Banco.model.PlazoFijo;
import ar.edu.utn.frgp.Banco.model.enums.Estado;
import ar.edu.utn.frgp.Banco.model.enums.TipoCuenta;
import ar.edu.utn.frgp.Banco.service.BusinessException;
import ar.edu.utn.frgp.Banco.service.IRecursoService;

public class RecursoServiceImpl implements IRecursoService {

	private IClienteDao clienteDao;
	private ICuentaDao cuentaDao;
	private IPlazosFijosDao plazofijoDao;
	private IMovimientosDao movimientoDao;

	// Esta anotacion solo debemos usarla si usamos el transactionManager sin
	// AOP (AspectJ)
	// @Transactional

	// CLIENTE
	public void crearCliente(Cliente cliente) throws Exception {
		clienteDao.create(cliente);
	}

	public Cliente getCliente(String dni) {
		return null;
	}

	public IClienteDao getClienteDao() {
		return clienteDao;
	}

	public List<Cliente> getClientes() {
		return clienteDao.getAll();
	}
	
	public void setClienteDao(IClienteDao clienteDao) {
		this.clienteDao = clienteDao;
	}
	
	public void modificarCliente(Cliente cliente)  {
		// TODO Auto-generated method stub
	}
	
	public void bajaCliente(String dNI) throws BusinessException {
		// TODO Auto-generated method stub
		
	}
	// CUENTA
	public void crearCuenta(Cuenta cuenta) throws Exception {
		cuentaDao.create(cuenta);
	}
	
	public ICuentaDao getCuentaDao() {
		return cuentaDao;
	}

	public List<Cuenta> getCuentas() {
		return cuentaDao.getAll();
	}
	
	public void setCuentaDao(ICuentaDao cuentaDao) {
		this.cuentaDao = cuentaDao;
	}
	
	public void ActualizarSaldoCuenta(Cuenta cuenta) {
	
		Cuenta cuentaoriginal = new Cuenta(); 
		cuentaoriginal = cuentaDao.getById(cuenta);
		
		cuentaoriginal.setSaldo(cuentaoriginal.getSaldo() + (cuenta.getSaldo()));
		cuentaDao.update(cuentaoriginal);
	}
	
	// PLAZOS FIJO
	public void crearPlazoFijo(PlazoFijo plazofijo) throws Exception {
		plazofijoDao.create(plazofijo);
	}
	
	public IPlazosFijosDao getPlazoFijoDao() {
		return plazofijoDao;
	}  
	
	public List<PlazoFijo> getPlazoFijos() {
		return plazofijoDao.getAll();
	}

	public IPlazosFijosDao getPlazofijoDao() {
		return plazofijoDao;
	}

	public void setPlazofijoDao(IPlazosFijosDao plazofijoDao) {
		this.plazofijoDao = plazofijoDao;
	}
		
	// Movimiento
	public IMovimientosDao getMovimientoDao() {
		return movimientoDao;
	}

	public List<Movimiento> getMovimientos() {
		return movimientoDao.getAll();
	}
	
	public IMovimientosDao getMovimientosDao() {
		return movimientoDao;
	}
	
	public void setMovimientoDao(IMovimientosDao movimientoDao) {
		this.movimientoDao = movimientoDao;
	}

	public void actualizarDescubierto(Cuenta cuenta, Double nuevoDescubierto)
			throws BusinessException {
		try {
			if (cuenta == null || cuenta.getNrocuenta() == 0) {
				throw new BusinessException("Cuenta invalidada");
			}

			// TODO: verificar signo de un bigdecimal.
			if (nuevoDescubierto < 0) {
				throw new BusinessException(
						"El descubierto no puede ser negativo.");
			}

			if (cuenta.getTipo() != TipoCuenta.CUENTA_CORRIENTE.ordinal()) {
				throw new BusinessException(
						"Solo las Cuentas Corrientes pueden tener descubierto.");
			}

			Cuenta cuentaOriginal = getCuentaDao().getById(cuenta);
			if (cuentaOriginal == null) {
				throw new BusinessException("No se encontro la cuenta: "
						+ cuenta.getId());
			}

			if (cuentaOriginal.getEstado() == Estado.INHABILITADA.ordinal()) {
				throw new BusinessException("La cuenta: " + cuenta.getId()
						+ " se encuenta inhabilitada.");
			}

			cuentaOriginal.setDescubierto(nuevoDescubierto);
			getCuentaDao().update(cuentaOriginal);

		} catch (Exception e) {
			throw new BusinessException(
					"Se produjo un error no contemplado al intentar actualizar el descubierto.");
		}
	}
}
